#include "usart.h"


UART_HandleTypeDef UART1_Handler; 

u8 USART1_RX_BUF[USART1_REC_LEN];    

u16 USART1_RX_STA=0;       
u8 aRxBuffer[RXBUFFERSIZE];

int fputc(int ch, FILE *f)
{ 	
	while((USART1->SR&0X40)==0);
	USART1->DR = (u8)ch;      
	return ch;
}


void USART1_Init(u32 bound)
{	

	UART1_Handler.Instance=USART1;					    
	UART1_Handler.Init.BaudRate=bound;				    
	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   
	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	    
	UART1_Handler.Init.Parity=UART_PARITY_NONE;		    
	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   
	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		    
	HAL_UART_Init(&UART1_Handler);					    

	HAL_UART_Receive_IT(&UART1_Handler, aRxBuffer, RXBUFFERSIZE);
}


void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{

	GPIO_InitTypeDef GPIO_InitStructure;
	
	if(huart->Instance==USART1)
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			
		__HAL_RCC_USART1_CLK_ENABLE();		
		
		GPIO_InitStructure.Pin=GPIO_PIN_9;			
		GPIO_InitStructure.Mode=GPIO_MODE_AF_PP;		
		GPIO_InitStructure.Pull=GPIO_PULLUP;			
		GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);	   

		GPIO_InitStructure.Pin=GPIO_PIN_10;			
		GPIO_InitStructure.Mode=GPIO_MODE_AF_INPUT;	
		HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);	   	
		
		HAL_NVIC_EnableIRQ(USART1_IRQn);		
		HAL_NVIC_SetPriority(USART1_IRQn,3,3);	

	}

}

/**
  * @brief  串口接收完成回调函数，HAL库在每次接收到1个字节后调用
  * @param  huart: 串口句柄
  * @retval 无
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)                    /* 如果是串口1 */
    {
        if ((USART1_RX_STA & 0x8000) == 0)             /* 接收未完成 */
        {
            if (USART1_RX_STA & 0x4000)                /* 接收到了0x0d（即回车键） */
            {
                if (aRxBuffer[0] != 0x0a)             /* 接收到的不是0x0a（即不是换行键） */
                {
                    USART1_RX_STA = 0;                 /* 接收错误,重新开始 */
                }
                else                                    /* 接收到的是0x0a（即换行键） */
                {
                    USART1_RX_STA |= 0x8000;           /* 接收完成了 */
					USART1_RX_BUF[USART1_RX_STA & 0x3FFF] = '\0';  /* 确保字符串结束符 */
                }
            }
            else                                        /* 还没收到0X0d（即回车键） */
            {
                if (aRxBuffer[0] == 0x0d)
                    USART1_RX_STA |= 0x4000;
                else
                {
                    USART1_RX_BUF[USART1_RX_STA & 0X3FFF] = aRxBuffer[0];
                    USART1_RX_STA++;

                    if (USART1_RX_STA > (USART1_REC_LEN - 1))
                    {
                        USART1_RX_STA = 0;             /* 接收数据错误,重新开始接收 */
                    }
                }
            }
        }

        HAL_UART_Receive_IT(&UART1_Handler, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
    }
}

void USART1_IRQHandler(void)
{
    HAL_UART_IRQHandler(&UART1_Handler);
}

